package wodegua.d18_collection;

import java.util.Comparator;
import java.util.Set;
import java.util.TreeSet;

/**
 * TreeSet
 * 特点:不重复、无索引、可排序(默认升序排序，按照元素的大小，由小到大排序)底层是基于红黑树实现的排序。
 * 注意:
 * 对于数值类型:Integer，Double，默认按照数值本身的大小进行升序排序。
 * ●对于字符串类型:默认按照首字符的编号升序排序。
 * 0 对于自定义类型如Student对象，Treeset默认是无法直接排序的
 */

/**
 * 自定义排序规则
 * TreeSet集合存储自定义类型的对象时，必须指定排序规则，支持如下两种方式来指定比较规则。
 * 方式一
 * 让自定义的类(如学生类)实现Comparable接口，重写里面的compareTo方法来指定比较规则。。
 * 方式二
 * 0 通过调用TreeSet集合有参数构造器，可以设置Comparator对象(比较器对象，用于指定比较规则。
 * public TreeSet(Comparator<?super E>comparator)
 */

/**
 * 两种方式中，关于返回值的规则:
 * 如果认为第一个元素 > 第二个元素 返回正整数即可。
 * 如果认为第一个元素<第二个元素返回负整数即可
 * 如果认为第一个元素=第二个元素返回0即可，此时Treeset集合只会保留一个元素，认为两者重复。
 * 注意:如果类本身有实现Comparable接口，TreeSet集合同时也自带比较器，默
 */
public class TreeSetTest {
    public static void main(String[] args) {
        Set<Integer> s = new TreeSet<>();
        s.add(6);
        s.add(5);
        s.add(5);
        s.add(8);
        s.add(7);
        System.out.println(s);

//        Set<Student> s1 = new TreeSet<>(new Comparator<Student>() {
//            @Override
//            public int compare(Student o1, Student o2) {
//                return o2.getAge() - o1.getAge();
//            }
//        });
//        Set<Student> s1 = new TreeSet<>((Student o1, Student o2) ->{
//                return o2.getAge() - o1.getAge();
//            }
//        );
        Set<Student> s1 = new TreeSet<>((o1, o2) ->Double.compare(o2.getHeight(), o1.getHeight()));
        s1.add(new Student("蜘蛛精", 23, 169.7));
        s1.add(new Student("紫霞", 22, 169.8));
        s1.add(new Student("至尊宝", 26, 165.5));
        s1.add(new Student("牛魔王", 22, 183.3));
        System.out.println(s1);
    }
}
